﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Net.Mail;
using System.Net;

namespace FlyShop
{
    public partial class FrmConsultaPromocao : Form
    {
        // Indica o código do registro selecionado na grid
        int linhaSelecionadaGrid = -1;

        OleDbConnection conexao;
        OleDbCommand comando;
        OleDbDataAdapter da;
        DataSet ds;
        String strConexao = "Provider=MSDAORA.1;Data Source=localhost;Persist Security Info=True;User ID=pi;Password=pi";
        String sqlConsulta = "select * from promocao";
        String sqlExcluiRegistro = "delete from promocao where cod_promocao = ?";
        String sqlConsultaFiltro = "select * from promocao where nome like ? ";

        public FrmConsultaPromocao()
        {
            InitializeComponent();
        }

       
        private void FrmConsultaPromocao_Load(object sender, EventArgs e)
        {
            conexao = new OleDbConnection(strConexao);
            conexao.Open();

            // Comando para configurar a sessão
            // Configura para o banco de dados ficar case-insensitive  
            OleDbCommand comandoAlteraSessao = new OleDbCommand("alter session set nls_sort=BINARY_CI", conexao);
            comandoAlteraSessao.ExecuteNonQuery();

            comandoAlteraSessao.CommandText = "alter session set nls_comp=LINGUISTIC";
            comandoAlteraSessao.ExecuteNonQuery();

            atualiza();
            formataGrid();
        }

        private void formataGrid()
        {
            dgvPromocao.Columns[0].Visible = false;
            dgvPromocao.Columns[1].HeaderText = "Nome";
            dgvPromocao.Columns[1].Width = 150;
            dgvPromocao.Columns[2].HeaderText = "Descrição";
            dgvPromocao.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dgvPromocao.Columns[3].HeaderText = "Ativa";
            dgvPromocao.Columns[3].Width = 40;
            dgvPromocao.Columns[4].HeaderText = "Cadastro";
            dgvPromocao.Columns[4].Width = 100;
            dgvPromocao.Columns[5].HeaderText = "Desconto";
            dgvPromocao.Columns[5].Width = 100;
            dgvPromocao.ScrollBars = ScrollBars.Vertical;
            dgvPromocao.RowHeadersVisible = false;
            dgvPromocao.MultiSelect = false;
            dgvPromocao.AllowUserToAddRows = false;
            dgvPromocao.AllowUserToDeleteRows = false;
            dgvPromocao.ReadOnly = true;
            dgvPromocao.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgvPromocao.TabStop = false;
        }

        private void atualiza()
        {
            // Faz uma consulta com todos os registros
            da = new OleDbDataAdapter(sqlConsulta, conexao);
            ds = new DataSet();
            da.Fill(ds, "Promocao");
            dgvPromocao.DataSource = ds.Tables["Promocao"];

            // Limpa a seleção e a variável de indicação do código
            dgvPromocao.ClearSelection();
            linhaSelecionadaGrid = -1;

            // Limpa a label de mensagem e imagem de notificação
            lblMensagem.Text = "";
            alertNotificacao.Hide();


            //foreach (DataGridViewRow row in dgvPromocao.Rows)
            //{
            //    if (row.Cells[3].Value.Equals("s"))
            //    {
            //        row.Cells[3].Value = "Sim";
            //    }
            //    else
            //    {
            //        row.Cells[3].Value = "Não";
            //    }
            //}

        }

        private void btnCadastrar_Click(object sender, EventArgs e)
        {
            FrmCadastroPromocao frmCadastro = new FrmCadastroPromocao();
            frmCadastro.Text = "Cadastro de promoção";
            frmCadastro.ShowDialog();
            atualiza();
        }


        private void btnAlterar_Click(object sender, EventArgs e)
        {
            if (linhaSelecionadaGrid != -1)
            {
                FrmCadastroPromocao frmEdicao = new FrmCadastroPromocao();
                frmEdicao.Text = "Edição de promoção";
                frmEdicao.edicao = true;
                frmEdicao.codPromocao = 
                    Int32.Parse(dgvPromocao.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                frmEdicao.ShowDialog();

                atualiza();
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para alterar.";
                alertNotificacao.Show();
            } 
        }

        private void dgvPromocao_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            linhaSelecionadaGrid = e.RowIndex;
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (linhaSelecionadaGrid != -1)
            {

                DialogResult drConfirmacao = MessageBox.Show(this, "Deseja excluir o registro selecionado?\nNão será possível excluir o registro caso ele tenha dependências.",
                 "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (drConfirmacao == DialogResult.Yes)
                {
                    comando = new OleDbCommand(sqlExcluiRegistro, conexao);

                    OleDbParameter pCod = new OleDbParameter("cod_promocao", OleDbType.Integer);
                    pCod.Value =
                        Int32.Parse(dgvPromocao.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                    comando.Parameters.Add(pCod);

                    // Caso o registro em questão tenha dependentes
                    // será lançada uma exceção
                    try
                    {
                        // Delete
                        comando.ExecuteNonQuery();
                        atualiza();
                    }
                    catch (OleDbException)
                    {
                        MessageBox.Show(this, "Não é possível excluir um registro com dependentes.",
                            "Operação inválida", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }

                
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para excluir.";
                alertNotificacao.Show();
            }
        }


        private void dgvPromocao_Sorted(object sender, EventArgs e)
        {
            dgvPromocao.ClearSelection();
            linhaSelecionadaGrid = -1;
        }

        private void dgvPromocao_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (linhaSelecionadaGrid != -1)
            {
                FrmCadastroPromocao frmEdicao = new FrmCadastroPromocao();
                frmEdicao.Text = "Edição de promoção";
                frmEdicao.edicao = true;
                frmEdicao.codPromocao =
                    Int32.Parse(dgvPromocao.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                frmEdicao.ShowDialog();

                atualiza();
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para alterar.";
                alertNotificacao.Show();
            } 
        }

        private void filtro_TextChanged(object sender, EventArgs e)
        {
            comando = new OleDbCommand(sqlConsultaFiltro, conexao);

            OleDbParameter pFiltroNome = new OleDbParameter("nome", OleDbType.VarChar);
            pFiltroNome.Value = txtNome.Text.Trim() + "%";
            comando.Parameters.Add(pFiltroNome);

            // Incrementa a clausula where do comando
            if (ckbSomenteAtivas.Checked)
            {
                OleDbParameter pFiltroAtivas = new OleDbParameter("ativa", OleDbType.VarChar);
                comando.CommandText += " and flag_ativo = 's'";
            }

            da = new OleDbDataAdapter(comando);
            ds.Clear();
            da.Fill(ds, "Aeroporto");
            dgvPromocao.DataSource = ds.Tables["Aeroporto"];

            dgvPromocao.ClearSelection();
            linhaSelecionadaGrid = -1;
        }

        private void btnPublicar_Click(object sender, EventArgs e)
        {
            // Chama uma segunda interface para publicação da promoção
            if (linhaSelecionadaGrid != -1)
            {
                if (dgvPromocao.Rows[linhaSelecionadaGrid].Cells[3].Value.ToString().Equals("s"))
                {

                    int codPromo = Int32.Parse(dgvPromocao.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                    String nomePromo = dgvPromocao.Rows[linhaSelecionadaGrid].Cells[1].Value.ToString();
                    String descPromo = dgvPromocao.Rows[linhaSelecionadaGrid].Cells[2].Value.ToString();
                    String dataCadPromo = dgvPromocao.Rows[linhaSelecionadaGrid].Cells[4].Value.ToString();
                    String vlrDescPromo = dgvPromocao.Rows[linhaSelecionadaGrid].Cells[5].Value.ToString();

                    FrmPublicaPromo frmPublica = new FrmPublicaPromo();
                    frmPublica.recebe(codPromo, nomePromo, descPromo, dataCadPromo, vlrDescPromo);
                    frmPublica.ShowDialog();

                    atualiza();
                }
                else
                {
                    lblMensagem.Text = "Selecione um registro ativo para publicar.";
                    alertNotificacao.Show();
                }
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para publicar.";
                alertNotificacao.Show();
            }


            

        }

        private void dgvPromocao_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            linhaSelecionadaGrid = e.RowIndex;
            
        }

        private void FrmConsultaPromocao_KeyDown(object sender, KeyEventArgs e)
        {
            //Hotkey para a tecla ESC fechar a janela
            if (e.KeyData == (Keys.Escape))
            {
                this.Close();
            }

            //Hotkey para novo cadastro
            if (e.KeyData == (Keys.Control | Keys.N))
            {
                btnCadastrar_Click(sender, e);
            }
        }
    }
}
